{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance (2nd ed.)\n",
    "\n",
    "**Mastering Data-Driven Finance**\n",
    "\n",
    "&copy; Dr. Yves J. Hilpisch | The Python Quants GmbH\n",
    "\n",
    "<img src=\"http://hilpisch.com/images/py4fi_2nd_shadow.png\" width=\"300px\" align=\"left\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Appendix: Dates and Times"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pylab import mpl, plt\n",
    "plt.style.use('seaborn')\n",
    "mpl.rcParams['font.family'] = 'serif'\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import datetime as dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 13, 10, 6, 829393)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.now()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 13, 10, 6, 836847)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "to = dt.datetime.today()  \n",
    "to"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(to)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.today().weekday()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 10, 31, 10, 5, 30, 500000)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = dt.datetime(2020, 10, 31, 10, 5, 30, 500000)  \n",
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2020-10-31 10:05:30.500000'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "str(d)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2020-10-31 10:05:30.500000\n"
     ]
    }
   ],
   "source": [
    "print(d)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2020"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.year  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.month  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "31"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.day  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.hour  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "737729"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "o = d.toordinal()  \n",
    "o"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 10, 31, 0, 0)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.fromordinal(o)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.time(10, 5, 30, 500000)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t = dt.datetime.time(d)  \n",
    "t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.time"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.date(2020, 10, 31)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dd = dt.datetime.date(d)  \n",
    "dd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 10, 31, 10, 5)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.replace(second=0, microsecond=0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.timedelta(699, 75323, 551256)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "td = d - dt.datetime.now()  \n",
    "td"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.timedelta"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(td)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "699"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "td.days"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "75323"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "td.seconds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "551256"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "td.microseconds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60468923.551256"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "td.total_seconds()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2020-10-31T10:05:30.500000'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.isoformat()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Saturday, 31. October 2020 10:05AM'"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.strftime('%A, %d. %B %Y %I:%M%p')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2017, 3, 31, 0, 0)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.strptime('2017-03-31', '%Y-%m-%d')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2016, 4, 30, 0, 0)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.strptime('30-4-16', '%d-%m-%y')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2020-10-31 10:05:30.500000'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds = str(d)\n",
    "ds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 10, 31, 10, 5, 30, 500000)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.strptime(ds, '%Y-%m-%d %H:%M:%S.%f')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 13, 10, 7, 17539)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.now()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 12, 10, 7, 22930)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.utcnow()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.timedelta(0, 3599, 999997)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt.datetime.now() - dt.datetime.utcnow()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "class UTC(dt.tzinfo):\n",
    "    def utcoffset(self, d):\n",
    "        return dt.timedelta(hours=0)  \n",
    "    def dst(self, d):\n",
    "        return dt.timedelta(hours=0)  \n",
    "    def tzname(self, d):\n",
    "        return 'UTC'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "u = dt.datetime.utcnow()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 12, 10, 7, 38722)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "u = u.replace(tzinfo=UTC())  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 12, 10, 7, 38722, tzinfo=<__main__.UTC object at 0x113d331d0>)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CEST(dt.tzinfo):\n",
    "    def utcoffset(self, d):\n",
    "        return dt.timedelta(hours=2)  \n",
    "    def dst(self, d):\n",
    "        return dt.timedelta(hours=1)  \n",
    "    def tzname(self, d):\n",
    "        return 'CEST'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 14, 10, 7, 38722, tzinfo=<__main__.CEST object at 0x113d33b38>)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = u.astimezone(CEST())  \n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 13, 10, 7, 38722, tzinfo=<__main__.CEST object at 0x113d33b38>)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c - c.dst()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pytz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'United States'"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pytz.country_names['US']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Europe/Brussels']"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pytz.country_timezones['BE']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Pacific/Wake',\n",
       " 'Pacific/Wallis',\n",
       " 'US/Alaska',\n",
       " 'US/Arizona',\n",
       " 'US/Central',\n",
       " 'US/Eastern',\n",
       " 'US/Hawaii',\n",
       " 'US/Mountain',\n",
       " 'US/Pacific',\n",
       " 'UTC']"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pytz.common_timezones[-10:]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "u = dt.datetime.utcnow()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "u = u.replace(tzinfo=pytz.utc)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 12, 10, 7, 164075, tzinfo=<UTC>)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 13, 10, 7, 164075, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u.astimezone(pytz.timezone('CET'))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 12, 10, 7, 164075, tzinfo=<StaticTzInfo 'GMT'>)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u.astimezone(pytz.timezone('GMT'))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2018, 12, 1, 6, 10, 7, 164075, tzinfo=<DstTzInfo 'US/Central' CST-1 day, 18:00:00 STD>)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u.astimezone(pytz.timezone('US/Central'))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## NumPy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.datetime64('2020-10-31')"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nd = np.datetime64('2020-10-31') \n",
    "nd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2020-10-31'"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.datetime_as_string(nd)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('D', 1)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.datetime_data(nd)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 10, 31, 10, 5, 30, 500000)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.datetime64('2020-10-31T10:05:30.500000')"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nd = np.datetime64(d)  \n",
    "nd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 10, 31, 10, 5, 30, 500000)"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nd.astype(dt.datetime)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.datetime64('2020-10-01')"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nd = np.datetime64('2020-10', 'D')\n",
    "nd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.datetime64('2020-10') == np.datetime64('2020-10-01')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-06-10', '2020-07-10', '2020-08-10'], dtype='datetime64[D]')"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(['2020-06-10', '2020-07-10', '2020-08-10'], dtype='datetime64')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-06-10T12:00:00', '2020-07-10T12:00:00',\n",
       "       '2020-08-10T12:00:00'], dtype='datetime64[s]')"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(['2020-06-10T12:00:00', '2020-07-10T12:00:00',\n",
    "          '2020-08-10T12:00:00'], dtype='datetime64[s]')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[D]')"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange('2020-01-01', '2020-01-04', dtype='datetime64')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06',\n",
       "       '2020-07', '2020-08', '2020-09'], dtype='datetime64[M]')"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange('2020-01-01', '2020-10-01', dtype='datetime64[M]')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2019-12-26', '2020-01-02', '2020-01-09', '2020-01-16',\n",
       "       '2020-01-23', '2020-01-30', '2020-02-06', '2020-02-13',\n",
       "       '2020-02-20', '2020-02-27'], dtype='datetime64[W]')"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange('2020-01-01', '2020-10-01', dtype='datetime64[W]')[:10]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-01-01T00', '2020-01-01T01', '2020-01-01T02', '2020-01-01T03',\n",
       "       '2020-01-01T04', '2020-01-01T05', '2020-01-01T06', '2020-01-01T07',\n",
       "       '2020-01-01T08', '2020-01-01T09'], dtype='datetime64[h]')"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtl = np.arange('2020-01-01T00:00:00', '2020-01-02T00:00:00',\n",
    "                dtype='datetime64[h]')  \n",
    "dtl[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-01-01T00:00:00', '2020-01-01T00:00:01',\n",
       "       '2020-01-01T00:00:02', '2020-01-01T00:00:03',\n",
       "       '2020-01-01T00:00:04', '2020-01-01T00:00:05',\n",
       "       '2020-01-01T00:00:06', '2020-01-01T00:00:07',\n",
       "       '2020-01-01T00:00:08', '2020-01-01T00:00:09'],\n",
       "      dtype='datetime64[s]')"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange('2020-01-01T00:00:00', '2020-01-02T00:00:00',\n",
    "          dtype='datetime64[s]')[:10]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-01-01T00:00:00.000', '2020-01-01T00:00:00.001',\n",
       "       '2020-01-01T00:00:00.002', '2020-01-01T00:00:00.003',\n",
       "       '2020-01-01T00:00:00.004', '2020-01-01T00:00:00.005',\n",
       "       '2020-01-01T00:00:00.006', '2020-01-01T00:00:00.007',\n",
       "       '2020-01-01T00:00:00.008', '2020-01-01T00:00:00.009'],\n",
       "      dtype='datetime64[ms]')"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange('2020-01-01T00:00:00', '2020-01-02T00:00:00',\n",
    "          dtype='datetime64[ms]')[:10]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(3000)\n",
    "rnd = np.random.standard_normal(len(dtl)).cumsum() ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(10, 6))\n",
    "plt.plot(dtl.astype(dt.datetime), rnd)  \n",
    "fig.autofmt_xdate();  \n",
    "# plt.savefig('../../images/a_dates/dt_01.png');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2020-06-30 00:00:00')"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts = pd.Timestamp('2020-06-30')  \n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime.datetime(2020, 6, 30, 0, 0)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = ts.to_pydatetime()  \n",
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2020-06-30 00:00:00')"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Timestamp(d)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2020-10-01 00:00:00')"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Timestamp(nd)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',\n",
       "               '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',\n",
       "               '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],\n",
       "              dtype='datetime64[ns]', freq='M')"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dti = pd.date_range('2020/01/01', freq='M', periods=12)  \n",
    "dti"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2020-07-31 00:00:00', freq='M')"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dti[6]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([datetime.datetime(2020, 1, 31, 0, 0),\n",
       "       datetime.datetime(2020, 2, 29, 0, 0),\n",
       "       datetime.datetime(2020, 3, 31, 0, 0),\n",
       "       datetime.datetime(2020, 4, 30, 0, 0),\n",
       "       datetime.datetime(2020, 5, 31, 0, 0),\n",
       "       datetime.datetime(2020, 6, 30, 0, 0),\n",
       "       datetime.datetime(2020, 7, 31, 0, 0),\n",
       "       datetime.datetime(2020, 8, 31, 0, 0),\n",
       "       datetime.datetime(2020, 9, 30, 0, 0),\n",
       "       datetime.datetime(2020, 10, 31, 0, 0),\n",
       "       datetime.datetime(2020, 11, 30, 0, 0),\n",
       "       datetime.datetime(2020, 12, 31, 0, 0)], dtype=object)"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pdi = dti.to_pydatetime()  \n",
    "pdi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',\n",
       "               '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',\n",
       "               '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],\n",
       "              dtype='datetime64[ns]', freq=None)"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DatetimeIndex(pdi)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 01:00:00',\n",
       "               '2020-01-01 02:00:00', '2020-01-01 03:00:00',\n",
       "               '2020-01-01 04:00:00', '2020-01-01 05:00:00',\n",
       "               '2020-01-01 06:00:00', '2020-01-01 07:00:00',\n",
       "               '2020-01-01 08:00:00', '2020-01-01 09:00:00',\n",
       "               '2020-01-01 10:00:00', '2020-01-01 11:00:00',\n",
       "               '2020-01-01 12:00:00', '2020-01-01 13:00:00',\n",
       "               '2020-01-01 14:00:00', '2020-01-01 15:00:00',\n",
       "               '2020-01-01 16:00:00', '2020-01-01 17:00:00',\n",
       "               '2020-01-01 18:00:00', '2020-01-01 19:00:00',\n",
       "               '2020-01-01 20:00:00', '2020-01-01 21:00:00',\n",
       "               '2020-01-01 22:00:00', '2020-01-01 23:00:00'],\n",
       "              dtype='datetime64[ns]', freq=None)"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DatetimeIndex(dtl)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "rnd = np.random.standard_normal(len(dti)).cumsum() ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(rnd, columns=['data'], index=dti)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot(figsize=(10, 6));\n",
    "# plt.savefig('../../images/a_dates/dt_02.png');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2020-01-31 00:00:00+01:00', '2020-02-29 00:00:00+01:00',\n",
       "               '2020-03-31 00:00:00+02:00', '2020-04-30 00:00:00+02:00',\n",
       "               '2020-05-31 00:00:00+02:00', '2020-06-30 00:00:00+02:00',\n",
       "               '2020-07-31 00:00:00+02:00', '2020-08-31 00:00:00+02:00',\n",
       "               '2020-09-30 00:00:00+02:00', '2020-10-31 00:00:00+01:00',\n",
       "               '2020-11-30 00:00:00+01:00', '2020-12-31 00:00:00+01:00'],\n",
       "              dtype='datetime64[ns, CET]', freq='M')"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.date_range('2020/01/01', freq='M', periods=12, tz=pytz.timezone('CET'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2020-01-31 00:00:00-05:00', '2020-02-29 00:00:00-05:00',\n",
       "               '2020-03-31 00:00:00-04:00', '2020-04-30 00:00:00-04:00',\n",
       "               '2020-05-31 00:00:00-04:00', '2020-06-30 00:00:00-04:00',\n",
       "               '2020-07-31 00:00:00-04:00', '2020-08-31 00:00:00-04:00',\n",
       "               '2020-09-30 00:00:00-04:00', '2020-10-31 00:00:00-04:00',\n",
       "               '2020-11-30 00:00:00-05:00', '2020-12-31 00:00:00-05:00'],\n",
       "              dtype='datetime64[ns, US/Eastern]', freq='M')"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dti = pd.date_range('2020/01/01', freq='M', periods=12, tz='US/Eastern')\n",
    "dti"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2020-01-31 05:00:00+00:00', '2020-02-29 05:00:00+00:00',\n",
       "               '2020-03-31 04:00:00+00:00', '2020-04-30 04:00:00+00:00',\n",
       "               '2020-05-31 04:00:00+00:00', '2020-06-30 04:00:00+00:00',\n",
       "               '2020-07-31 04:00:00+00:00', '2020-08-31 04:00:00+00:00',\n",
       "               '2020-09-30 04:00:00+00:00', '2020-10-31 04:00:00+00:00',\n",
       "               '2020-11-30 05:00:00+00:00', '2020-12-31 05:00:00+00:00'],\n",
       "              dtype='datetime64[ns, GMT]', freq='M')"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dti.tz_convert('GMT')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://tpq.io\" target=\"_blank\">http://tpq.io</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a> | <a href=\"mailto:training@tpq.io\">training@tpq.io</a>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
